import pandas as pd
import numpy as np

m = np.float64(0)  # 학습할 기울기: 예측 모델은 y = mx
alpha = np.float64(0.01)  # 학습률

df = pd.read_csv('linear_regression_data.csv')
raw_data = df.sample(frac=1, random_state=42)
n = raw_data.shape[0]

X_train = raw_data.iloc[:int(n * 0.8), 0]
Y_train = raw_data.iloc[:int(n * 0.8), 1]
X_test = raw_data.iloc[int(n * 0.8):, 0]
Y_test = raw_data.iloc[int(n * 0.8):, 1]

while True:
    mse = ((m * X_train - Y_train) ** 2).mean()
    # MSE'(m): 현재 m에서 MSE 곡선의 접선 기울기
    differ_m = (2 * X_train * (m * X_train - Y_train)).mean()

    if abs(differ_m) < 0.00001:
        print(f'최적의 m값: {m} / 이때의 MSE: {mse}')
        break

    m = m - alpha * differ_m

mse_test = ((m * X_test - Y_test) ** 2).mean()
print(f'테스트 데이터의 MSE: {mse_test}')
